package cn.jr.util;

import java.util.ArrayList;
import java.util.List;

/**
 * 控制台输出样式工具类
 * 支持控制文本颜色、背景色、样式及布局
 * 注意：部分功能可能不支持所有终端（如Windows默认命令提示符需要启用ANSI支持）
 */
public class ConsoleStyleUtils {
    // 重置所有样式
    public static final String RESET = "\033[0m";

    // 文本样式
    public static final String BOLD = "\033[1m";         // 粗体
    public static final String ITALIC = "\033[3m";       // 斜体
    public static final String UNDERLINE = "\033[4m";    // 下划线
    public static final String BLINK = "\033[5m";        // 闪烁（部分终端不支持）
    public static final String REVERSE = "\033[7m";      // 反色（前景色与背景色互换）

    // 前景色（文本颜色）
    public static final String BLACK = "\033[30m";
    public static final String RED = "\033[31m";
    public static final String GREEN = "\033[32m";
    public static final String YELLOW = "\033[33m";
    public static final String BLUE = "\033[34m";
    public static final String MAGENTA = "\033[35m";
    public static final String CYAN = "\033[36m";
    public static final String WHITE = "\033[37m";

    // 亮色前景色
    public static final String BRIGHT_BLACK = "\033[90m";
    public static final String BRIGHT_RED = "\033[91m";
    public static final String BRIGHT_GREEN = "\033[92m";
    public static final String BRIGHT_YELLOW = "\033[93m";
    public static final String BRIGHT_BLUE = "\033[94m";
    public static final String BRIGHT_MAGENTA = "\033[95m";
    public static final String BRIGHT_CYAN = "\033[96m";
    public static final String BRIGHT_WHITE = "\033[97m";

    // 背景色
    public static final String BG_BLACK = "\033[40m";
    public static final String BG_RED = "\033[41m";
    public static final String BG_GREEN = "\033[42m";
    public static final String BG_YELLOW = "\033[43m";
    public static final String BG_BLUE = "\033[44m";
    public static final String BG_MAGENTA = "\033[45m";
    public static final String BG_CYAN = "\033[46m";
    public static final String BG_WHITE = "\033[47m";

    // 亮色背景色
    public static final String BG_BRIGHT_BLACK = "\033[100m";
    public static final String BG_BRIGHT_RED = "\033[101m";
    public static final String BG_BRIGHT_GREEN = "\033[102m";
    public static final String BG_BRIGHT_YELLOW = "\033[103m";
    public static final String BG_BRIGHT_BLUE = "\033[104m";
    public static final String BG_BRIGHT_MAGENTA = "\033[105m";
    public static final String BG_BRIGHT_CYAN = "\033[106m";
    public static final String BG_BRIGHT_WHITE = "\033[107m";

    /**
     * 输出带样式的文本
     * @param text 要输出的文本
     * @param styles 样式列表（可以是颜色、背景、文本样式的组合）
     */
    public static void printStyled(String text, String... styles) {
        // 拼接所有样式
        StringBuilder styleBuilder = new StringBuilder();
        for (String style : styles) {
            styleBuilder.append(style);
        }
        // 输出带样式的文本并重置样式
        System.out.print(styleBuilder.toString() + text + RESET);
    }

    /**
     * 输出带样式的文本并换行
     * @param text 要输出的文本
     * @param styles 样式列表
     */
    public static void printlnStyled(String text, String... styles) {
        printStyled(text + "\n", styles);
    }

    /**
     * 居中对齐文本
     * @param text 文本内容
     * @param width 总宽度
     * @return 居中对齐后的字符串
     */
    public static String centerAlign(String text, int width) {
        if (text.length() >= width) {
            return text;
        }
        int leftSpaces = (width - text.length()) / 2;
        int rightSpaces = width - text.length() - leftSpaces;
        return " ".repeat(leftSpaces) + text + " ".repeat(rightSpaces);
    }

    /**
     * 左对齐文本
     * @param text 文本内容
     * @param width 总宽度
     * @return 左对齐后的字符串
     */
    public static String leftAlign(String text, int width) {
        if (text.length() >= width) {
            return text;
        }
        return text + " ".repeat(width - text.length());
    }

    /**
     * 右对齐文本
     * @param text 文本内容
     * @param width 总宽度
     * @return 右对齐后的字符串
     */
    public static String rightAlign(String text, int width) {
        if (text.length() >= width) {
            return text;
        }
        return " ".repeat(width - text.length()) + text;
    }

    /**
     * 创建分隔线
     * @param length 分隔线长度
     * @param symbol 分隔符号
     * @param styles 分隔线样式
     */
    public static void printSeparator(int length, String symbol, String... styles) {
        if (symbol == null || symbol.isEmpty()) {
            symbol = "-";
        }
        String line = symbol.repeat(length);
        printStyled(line + "\n", styles);
    }

    /**
     * 打印带边框的文本块
     * @param content 内容列表，每行一个元素
     * @param padding 内边距
     * @param styles 边框样式
     */
    public static void printBorderedBlock(List<String> content, int padding, String... styles) {
        if (content == null || content.isEmpty()) {
            return;
        }

        // 计算最长行的长度
        int maxLength = content.stream()
                .mapToInt(String::length)
                .max()
                .orElse(0);

        int totalWidth = maxLength + 2 * (padding + 1);

        // 打印顶部边框
        printSeparator(totalWidth, "=", styles);

        // 打印内容行
        for (String line : content) {
            String paddedLine = " ".repeat(padding) +
                    leftAlign(line, maxLength) +
                    " ".repeat(padding);
            printStyled("|", styles);
            System.out.print(paddedLine);
            printStyled("|\n", styles);
        }

        // 打印底部边框
        printSeparator(totalWidth, "=", styles);
    }

    /**
     * 测试方法
     */
    public static void main(String[] args) {
        // 测试基本样式
        printlnStyled("这是普通文本", RESET);
        printlnStyled("这是红色粗体文本", RED, BOLD);
        printlnStyled("这是蓝色背景的黄色文本", YELLOW, BG_BLUE, UNDERLINE);
        printlnStyled("这是亮绿色斜体文本", BRIGHT_GREEN, ITALIC);

        // 测试分隔线
        printSeparator(50, "-", CYAN);

        // 测试对齐方式
        printlnStyled("居中对齐文本", GREEN);
        printStyled(centerAlign("居中显示", 50) + "\n", BRIGHT_YELLOW);

        printlnStyled("\n左对齐和右对齐示例", GREEN);
        printStyled(leftAlign("左侧", 25) + rightAlign("右侧", 25) + "\n", BRIGHT_CYAN);

        // 测试带边框的文本块
        List<String> blockContent = new ArrayList<>();
        blockContent.add("欢迎使用控制台样式工具类");
        blockContent.add("支持多种文本样式和布局");
        blockContent.add("版本: 1.0.0");

        System.out.println();
        printlnStyled("带边框的文本块示例", MAGENTA, BOLD);
        printBorderedBlock(blockContent, 2, BRIGHT_MAGENTA);
    }
}
